package PHANVANVUONG.XML.DEMO;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class MODELS {

    /***
     * Nghiệp vụ đọc dữ liệu trong files XML có sẵn
     * @param lisField - Chứa danh sách các trường dữ liệu. Chỉ số = 0 dành cho Node Atribute Key.
     * @param elementNode - Phần tử Node con của Root Node. Ví dụ: <iMIC><Student></Student></iMIC> --> Root Node = "iMIC" & Element Node = "Student"
     * @param path - Chứa đường dẫn resource. Ví dụ: "D:imic/xml/Student.xml"
     * @return List<List<HashMap<String, String>>>
     * @throws Exception 
     */
    public List<List<HashMap<String, String>>> XMLOfItems(List<Object> lisField, String elementNode, String path)
            throws Exception {

        // Khai báo & khởi tạo các đối tượng
        List<List<HashMap<String, String>>> lisHash = new ArrayList<List<HashMap<String, String>>>();
        List<HashMap<String, String>> lisTemp = new ArrayList<HashMap<String, String>>();
        try {
            // 1. Khởi tạo đối tượng files (tham chiếu tới files)
            File fXmlFile = new File(path);
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = null;

            // 2. Kiểm tra files trước khi bindding dữ liệu trong files XML vào
            // Documents
            if (fXmlFile.exists()) {
                doc = dBuilder.parse(fXmlFile);
                doc.getDocumentElement().normalize();
                // 3. Lấy ra danh sách phần tử "Student"
                NodeList nList = doc.getElementsByTagName(elementNode);

                // 4. Khai báo và khởi tạo HashMap
                HashMap<String, String> objHash = null;

                int iItems = nList.getLength();
                // 4. Duyệt danh sách phần tử trong nList
                String key = "";
                String value = "";
                for (int j = 0; j < iItems; j++) {
                    Node nNode = nList.item(j);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        objHash = new HashMap<String, String>();

                        for (int k = 0; k < lisField.size(); k++) {
                            if (k == 0) {
                                // Identify atribute key - Id
                                key = "" + lisField.get(k);
                                value = "" + eElement.getAttribute("" + lisField.get(k));
                                objHash.put(key, value);
                            } else {
                                // Node items in Element Node
                                key = "" + lisField.get(k);
                                value = ""
                                        + eElement.getElementsByTagName("" + lisField.get(k)).item(0).getTextContent();
                                objHash.put(key, value);
                            }
                        }
                        // 5. Gắn thông tin vào List<HashMap<String, String>>
                        lisTemp.add(objHash);
                    }
                }
                // 6. Add các List<HashMap<String, String>> vào trong
                // List<List<HashMap<String, String>>>
                lisHash.add(lisTemp);
            } else {
                return null;
            }
        } catch (Exception e) {
            throw e;
        }
        return lisHash;
    }
}
